package com.lkd.client.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lkd.client.config.EmqConfig;
import com.lkd.client.emq.EmqClient;
import com.lkd.client.emq.msg.*;
import com.lkd.client.mapper.VendoutOrderMapper;
import com.lkd.client.pojo.VendoutOrder;
import com.lkd.client.service.DataProcessService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
@Transactional //所有方法支持事物回滚
public class DataProcessServcieIml implements DataProcessService {


    @Autowired
    private VendoutOrderMapper vendoutOrderMapper;

    @Autowired
    private EmqClient emqClient;

    @Autowired
    private EmqConfig emqConfig;

    @Override
    public void vendoutReq(VendoutContract vendoutContract) {
        if(vendoutContract.getVendoutData()!=null){
            VendoutData vendoutData = vendoutContract.getVendoutData();
            //先查询订单，是否重复
            VendoutOrder vendoutOrder = vendoutOrderMapper.selectById(vendoutData.getOrderNo());
            if(vendoutOrder!=null) {
                log.info("订单重复"+vendoutData.getOrderNo());
                return;
            }
            //创建出货记录
            vendoutOrder=new VendoutOrder();
            BeanUtils.copyProperties(vendoutData,vendoutOrder);
            vendoutOrder.setOutTime(LocalDateTime.now()); //出货时间
            vendoutOrder.setResultCode(3);  //3:机器出货中
            vendoutOrderMapper.insert(vendoutOrder);

            //出货
            try {
                log.info("出货货道“"+vendoutData.getChannelCode());
                //todo: 串口编程--- Rxtx串口开发
                //如果出货成功，修改状态为出货成功
                vendoutOrder.setResultCode(4);  //出货完成
                vendoutOrderMapper.updateById(vendoutOrder);//如果出错，则
                vendoutResp(vendoutData.getOrderNo(),true);  //成功结果
            } catch (Exception e) {  //如果失败
                log.error("出货失败",e);
                vendoutOrder.setResultCode(2);  //硬件错误
                vendoutOrderMapper.updateById(vendoutOrder);//如果出错，则
                vendoutResp(vendoutData.getOrderNo(),false);  //失败结果
            }
        }
    }

    @Override
    public void vendoutResp(String orderNo,Boolean success) {
        VendoutOrder vendoutOrder= vendoutOrderMapper.selectById(orderNo);
        VendoutResultContract vendoutResultContract=new VendoutResultContract();
        vendoutResultContract.setInnerCode(emqConfig.getInnerCode());//售货机编号
        VendoutData vendoutData=new VendoutData();
        BeanUtils.copyProperties( vendoutOrder,vendoutData );
        vendoutResultContract.setVendoutData(vendoutData); //发货数据
        vendoutResultContract.setSuccess(success);  //是否成功
        //向服务端发送结果
        emqClient.publish(emqConfig.getResultTopic(), JSON.toJSONString(vendoutResultContract) );
        log.info("向服务端发送结果 :{}",JSON.toJSONString(vendoutResultContract));
    }

    @Override
    public void vendoutComplete(String orderNo) {
        log.info("-------------vendoutComplete-------------{}",orderNo);
        VendoutOrder vendoutOrder= vendoutOrderMapper.selectById(orderNo);
        vendoutOrder.setPushCode(1);//完成上报
        vendoutOrderMapper.updateById(vendoutOrder);
    }

    @Override
    public void checkVendoutOrder() {
        //查询所有未上报的，完成时间大于2分钟的。
        QueryWrapper<VendoutOrder> wrapper=new QueryWrapper<>();
        wrapper.lambda()
                .eq(  VendoutOrder::getPushCode,0 )
                .le( VendoutOrder::getOutTime , LocalDateTime.now().plusMinutes(-2));
        List<VendoutOrder> list = vendoutOrderMapper.selectList(wrapper);
        //补偿
        list.stream().forEach( c->{
            log.info("补偿订单：{}",c.getOrderNo());
            vendoutResp(c.getOrderNo(),true);
        });
    }


    @Override
    public void checkStatus() {
        log.info("设备自检");
        // todo: 设备自检
        // 发送自检报文（模拟）
        VmStatusContract vmStatusContract=new VmStatusContract();
        vmStatusContract.setInnerCode(emqConfig.getInnerCode());

        vmStatusContract.setStatusInfo(new ArrayList<>());

        StatusInfo statusInfo_1001=new StatusInfo();
        statusInfo_1001.setStatusCode("1001");  //零件编码(货道弹簧)
        statusInfo_1001.setStatus(true);
        vmStatusContract.getStatusInfo().add(statusInfo_1001);

        StatusInfo statusInfo_1002=new StatusInfo();
        statusInfo_1002.setStatusCode("1002");  //零件编码（制冷器）
        statusInfo_1002.setStatus(true);
        vmStatusContract.getStatusInfo().add(statusInfo_1002);

        //发送自检报文
        emqClient.publish(emqConfig.getStatusTopic() , JSON.toJSONString(vmStatusContract) );

    }

}
